p-PP: ChatGPT Agentを作る
エージェントをChatGPTにデプロイできるようにするらしい
これどこに書いてあった?基素.icon
Webベースでタスク管理してChatGPTのUIを使えるようなことを想定してAgentを組むのが良さそう
2025-10-11
https://gyazo.com/97598882368fd265e1933876e3dd70a1
APIエンドポイントの認証フロー
認証フロー全体像
[ブラウザ] → [Firebase Auth] → [ChatKit] → [Agent Tools API]
1. ログイン時
code:chatkit.ts
// :450-471
onAuthStateChanged(auth, async (user) => {
if (user) {
currentUser = user;
idToken = await user.getIdToken(); // ← Firebase IDトークン取得
// ...
initializeChatKit();
}
});
Firebase IDトークン:
JWTフォーマット(JSON Web Token)
ユーザー情報が暗号化されて含まれる(sub=ユーザーID、emailなど)
Firebaseの秘密鍵で署名されている
有効期限1時間
2. ChatKit初期化時 (chatkit.ts:473-479)
code:ts
function initializeChatKit() {
const authToken = isUsingEmulator ? 'test' : idToken;
const defaultHeaders = {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + authToken, // ← IDトークンをヘッダーに設定
'X-Chatkit-User': userId
};
3. Function Call実行時 (chatkit.ts:508-550)
OpenAI Agent Builderが「タスクを取得しよう」と判断すると:
code:chatkit.ts
onClientTool: async (invocation) => {
// invocation.name = 'getQuickTaskCandidates'
// invocation.params = { maxMinutes: 30, currentEnergy: 'mid', limit: 5 }
let endpoint = '/api/agent-tools/getQuickTaskCandidates';
const response = await fetch(endpoint, {
method: 'POST',
headers: { ...defaultHeaders }, // ← ここでAuthorization: Bearer
{idToken}が付く
body: JSON.stringify(invocation.params)
});
重要: defaultHeadersを展開することで、全てのAPI呼び出しに自動的にFirebaseIDトークンが含まれる
4. Agent Tools API側の検証 (agent-tools.ts:55-120)
code: (agent-tools.ts
agentToolsApp.post(
"/api/agent-tools/getQuickTaskCandidates",
conditionalFirebaseAuth(), // ← ミドルウェア1
verifyOwner, // ← ミドルウェア2
async (c) => { /* ... */ }
);
ミドルウェア1: conditionalFirebaseAuth()
// Authorizationヘッダーを取得
const authHeader = c.req.header("Authorization");
// "Bearer eyJhbGciO.." のような形式
if (isLocalDev && authHeader === Bearer ${c.env.ADMIN_TOKEN}) {
// ローカル開発: ADMIN_TOKENならバイパス
return next();
}
// 本番: Firebase Admin SDKでトークン検証
return firebaseAuthMiddleware(c, next);
Firebase Admin SDKの検証内容:
1. 署名検証: Firebaseの公開鍵で署名を検証(改ざんされていないか)
2. 有効期限チェック: トークンのexp(expiration)が現在時刻より未来か
3. 発行者チェック: iss(issuer)がFirebaseのURLか
4. プロジェクトIDチェック: aud(audience)が正しいプロジェクトIDか
検証が通ると、トークンの中身(ペイロード)をc.var.firebaseTokenに保存
code:ts
ミドルウェア2: verifyOwner
// Firebase認証で取得したトークンを取得
const token = getFirebaseToken(c); // c.var.firebaseTokenを取得
// トークン内のユーザーIDを確認
if (token.sub !== c.env.OWNER_USER_ID) {
return c.json({ error: "Forbidden" }, 403); // ← 所有者以外は拒否
}
await next(); // ← 認証OK、API実行へ
5. セキュリティポイント
table:_
チェック項目 検証内容 攻撃への対策
署名検証 Firebaseの秘密鍵で署名されているか 偽造トークンを防ぐ
有効期限 トークンが期限切れでないか リプレイ攻撃を防ぐ
発行者 Firebaseが発行したか 他サービスのトークンを防ぐ
所有者確認 subがOWNER_USER_IDか 他ユーザーのアクセスを防ぐ
6. ローカル開発時の動作
export ADMIN_TOKEN="your-secret-token"
npm run dev
フロントエンドで:
const authToken = isUsingEmulator ? 'test' : idToken;
バックエンドで:
code:ts
if (authHeader === Bearer test) {
console.log("🔓 Dev mode: Bypassing Firebase auth with ADMIN_TOKEN");
return next(); // 検証スキップ
}
これにより、ローカル開発時はFirebase認証なしで動作します。
2025-10-08
まずエージェントで以下のことを確認する
Agent Builderを使って、Agentを作成する
タスク追加、編集、削除
削除は人間に任せてもいいかも。少なくとも明確なフィードバックがないと
知らないうちに消えるかも不安が生まれる
必要なデータをllmに渡すためのAPI実装
今はdiscordのコマンドのハンドラと結びついていてAPIはない
suggestは必要な情報を機械的に渡してプロンプトで選んでもらっている
taskでタスク追加が必要かとかをどう判定してどう内部APIを読んでいるのかは知らないので調べる
コンテキスト保持はChatKitでできる?
そういう機能はない。バックエンドに自分で実装する
データソースの取得方法は?
API呼び出し?
認証方法は?
大きく2つのステップがある
Agentの作成
ChatKitでUIを作成する
日に1回バッチでVector Storeを更新する
作成したvector embeddingをAgentのtoolとして利用できるように設定する
https://gyazo.com/a2587b3cdd42efd7ecf742175480911d
タスクを参照できる
https://gyazo.com/6e22c1d7afcbcc2247a7e3ea8d98f39b
組み込むためのアプリをどうするかは後で考える
作ってるうちにChatGPTに組み込めるようになったらそれを使えばいいし
ドキュメントを読んでサンプルを動かした。今までやっていたタスクはエージェントにやらせるのが良さそうな不定形で複雑なタスクだったことがわかった。こっちでやる方が筋が良さそうだ。
Agentのinstructionを再考した
ハマった:workflowをdeployしたのにnot foundエラーが出続けた
更新してもnot foundのままでラチが空かないので、ワークフローをコピーしてデプロイして、そちらを使うようにしたら使えた
デプロイしても失敗する時がある?
一応ChatUIは動くようになったが、toolがうまく動いていないようでsuggestがうまくいかない。toolの動作チェックが必要
toolの実装がstubになっている
✅エージェント作成を試す 🍅4
At Ramp, the team went from a blank canvas to a buyer agent in just a few hours:
Agent Builder transformed what once took months of complex orchestration, custom code, and manual optimizations into just a couple of hours.
https://gyazo.com/4f69f5a142cac89498cca1ffd7b1fa16
手を入れるたびに絶対にdiscordではなくこれでやるべきだという確信が強まる